xend: destroy stubdoms synchronously
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 15 Oct 2009 07:16:42 +0000 (08:16 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 15 Oct 2009 07:16:42 +0000 (08:16 +0100)
This patch makes the destruction of stubdoms a synchronous event,
therefore it is no longer possible to run out of memory when rebooting
a guest because the stubdom of the old guest is always destroyed
before the creation of the new guest.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
stubdom/stubdom-dm
tools/python/xen/xend/XendDomainInfo.py
tools/python/xen/xend/image.py

index b76dab278bcd3b30ce91c54181e16450cedab596..bf77d1fad1944d4741b7c3b9138ca7bff8f2a8b8 100644 (file)
@@ -81,12 +81,8 @@ done
 
 term() {
     kill %1
-    (
-       [ -n "$vncpid" ] && kill -9 $vncpid
-       rm ${stubdom_configdir}/$domname-dm
-       xm destroy $domname-dm
-    ) &
-    # We need to exit immediately so as to let xend do the commands above
+    [ -n "$vncpid" ] && kill -9 $vncpid
+    rm ${stubdom_configdir}/$domname-dm
     exit 0
 }
 
index 5e9f0fe6e12ecf0e2ebf85529bf5425e8f6e09af..724c50951eb905163025f7788013d361cb7c6d7f 100644 (file)
@@ -855,12 +855,10 @@ class XendDomainInfo:
         dev_config = pci_convert_sxp_to_dict(dev_sxp)
         dev = dev_config['devs'][0]
 
-        dom_list = xstransact.List('/local/domain')
-        for d in dom_list:
-            target = xstransact.Read('/local/domain/' + d + '/target')
-            if target is not None and int(target) is self.domid :
-                from xen.xend import XendDomain
-                XendDomain.instance().domain_lookup(int(d)).pci_device_configure(dev_sxp[:])
+        stubdomid = self.getStubdomDomid()
+        if stubdomid is not None :
+            from xen.xend import XendDomain
+            XendDomain.instance().domain_lookup(stubdomid).pci_device_configure(dev_sxp[:])
 
         # Do HVM specific processing
         if self.info.is_hvm():
@@ -1810,6 +1808,14 @@ class XendDomainInfo:
     def getDomid(self):
         return self.domid
 
+    def getStubdomDomid(self):
+        dom_list = xstransact.List('/local/domain')
+        for d in dom_list:
+            target = xstransact.Read('/local/domain/' + d + '/target')
+            if target is not None and int(target) is self.domid :
+                return int(d)
+        return None
+
     def setName(self, name, to_store = True):
         self._checkName(name)
         self.info['name_label'] = name
index 2bbe9b484a67c39184f3655981ff8b72762cdbed..faf12eabcee7f8bd14538b6c00ada29c47c9c4c1 100644 (file)
@@ -591,7 +591,11 @@ class ImageHandler:
             return
         self.sentinel_lock.acquire()
         try:
-            if self.pid:
+            stubdomid = self.vm.getStubdomDomid()
+            if stubdomid is not None :
+                from xen.xend import XendDomain
+                XendDomain.instance().domain_destroy(stubdomid)
+            elif self.pid:
                 try:
                     os.kill(self.pid, signal.SIGHUP)
                 except OSError, exn: